import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/services/index.dart';
import '../../../common/models/index.dart';
import '../../../common/mixins/index.dart';
// 移除不必要的导入：已移除直接控制器间的耦合

/// 专家信息编辑页面控制器
/// 负责专家个人信息的展示和编辑功能
/// 遵循GetX控制器标准化结构（9个部分）
/// 使用UserProfileMixin提供专家信息访问能力
class PeofileDetialController extends GetxController with UserProfileMixin {
  // 1. 静态常量（类级别）- 使用lowerCamelCase命名
  static const String tag = 'PeofileDetialController';
  static const int maxRetryCount = 3;
  static const Duration updateTimeout = Duration(seconds: 10);
  
  // 2. 实例常量
  final String pageTitle = '编辑专家信息';
  final String welcomeMessage = '完善您的专家信息';
  
  // 3. 响应式变量（Rx系列）- 使用.obs写法（推荐95%场景）
  // 基础类型响应式变量
  var isLoading = false.obs;                    // RxBool - 加载状态
  var isSaving = false.obs;                     // RxBool - 保存状态
  var hasError = false.obs;                     // RxBool - 错误状态
  var hasChanges = false.obs;                   // RxBool - 是否有修改
  var errorMessage = ''.obs;                    // RxString - 错误信息
  
  // 🔄 移除本地响应式变量 - 直接从UserService获取数据
  // UI显示数据直接从UserService获取，不在Controller中缓存
  
  // 🎯 原始值记录（用于智能变更检测）
  String _originalName = '';
  String _originalCorpName = '';
  String _originalOfficialCapacity = '';
  String _originalPhone = '';
  String _originalEmail = '';
  
  // 可空类型响应式变量（特殊场景使用）
  var lastUpdateTime = RxnString();             // RxnString - 上次更新时间（可空）
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  
  // 5. 控制器和服务依赖
  // 表单控制器
  final TextEditingController nameController = TextEditingController();
  final TextEditingController corpNameController = TextEditingController();
  final TextEditingController officialCapacityController = TextEditingController();
  final TextEditingController phoneController = TextEditingController();
  final TextEditingController emailController = TextEditingController();
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  
  // 服务依赖
  UserService get _userService => Get.find<UserService>();
  
  // 6. 构造函数
  PeofileDetialController() {
    debugPrint('$tag: Constructor - 控制器已创建 ${DateTime.now()}');
  }
  
  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化个人信息编辑页面数据');
    
    if (!_isInitialized) {
      // 检查用户登录状态
      _checkUserLoginStatus();
      
      // 加载专家信息
      _loadExpertInfo();
      
      // 设置表单监听
      _setupFormListeners();
      
      // 设置已初始化标志
      _isInitialized = true;
      
      debugPrint('$tag: 页面数据初始化完成');
    }
    
    // 通知UI更新
    update(["profile_detial"]);
  }
  
  /// 检查用户登录状态
  void _checkUserLoginStatus() {
    final isLoggedIn = _userService.isLoggedIn;
    debugPrint('$tag: 用户登录状态检查 - isLoggedIn: $isLoggedIn');
    
    if (!isLoggedIn) {
      debugPrint('$tag: 用户未登录，返回上一页');
      _handleError('用户未登录');
      Get.back();
      return;
    }
  }
  
  /// 初始化表单控制器（从UserService获取专家数据）
  void _loadExpertInfo() {
    try {
      debugPrint('$tag: 开始初始化表单控制器');
      
      final expertInfo = currentExpertInfo; // 直接从UserService获取
      if (expertInfo != null) {
        
        debugPrint('$tag: 🔍 从UserService获取到的专家数据:');
        debugPrint('$tag:   📝 姓名: ${expertInfo.name}');
        debugPrint('$tag:   📝 机构: ${expertInfo.corpName}');
        debugPrint('$tag:   📝 职务: ${expertInfo.officialCapacity}');
        debugPrint('$tag:   📝 手机: ${expertInfo.phone}');
        debugPrint('$tag:   📝 邮箱: ${expertInfo.email}');
        
        // 🎯 只更新表单控制器，不再维护本地响应式变量
        nameController.text = expertInfo.name ?? '';
        corpNameController.text = expertInfo.corpName ?? '';
        officialCapacityController.text = expertInfo.officialCapacity ?? '';
        phoneController.text = expertInfo.phone ?? '';
        emailController.text = expertInfo.email ?? '';
        
        // 🎯 保存原始值用于智能变更检测
        _originalName = expertInfo.name ?? '';
        _originalCorpName = expertInfo.corpName ?? '';
        _originalOfficialCapacity = expertInfo.officialCapacity ?? '';
        _originalPhone = expertInfo.phone ?? '';
        _originalEmail = expertInfo.email ?? '';
        
        debugPrint('$tag: 表单控制器初始化完成 - ${expertInfo.name}');
        debugPrint('$tag: 🎯 UI显示数据直接从UserService获取，无需本地缓存');
        debugPrint('$tag: 📝 原始值已保存: name=$_originalName, corpName=$_originalCorpName, phone=$_originalPhone');
      } else {
        debugPrint('$tag: 未找到专家信息');
        _handleError('未找到专家信息');
      }
      
    } catch (e) {
      debugPrint('$tag: 初始化表单控制器失败: $e');
      _handleError('加载专家信息失败');
    }
  }
  
  /// 设置表单监听器
  void _setupFormListeners() {
    debugPrint('$tag: 设置表单监听器');
    
    // 监听专家姓名变化
    nameController.addListener(() {
      _onFormChanged();
    });
    
    // 监听机构名称变化
    corpNameController.addListener(() {
      _onFormChanged();
    });
    
    // 监听职务变化
    officialCapacityController.addListener(() {
      _onFormChanged();
    });
    
    // 监听手机号变化
    phoneController.addListener(() {
      _onFormChanged();
    });
    
    // 监听邮箱变化
    emailController.addListener(() {
      _onFormChanged();
    });
    
    // 🎯 监听UserService专家信息变化，自动更新UI
    ever(_userService.currentExpertInfoRx, (expertInfo) {
      debugPrint('$tag: UserService专家信息发生变化，更新UI显示');
      update(["profile_detial"]);
    });
  }
  
  /// 表单内容变化处理
  void _onFormChanged() {
    debugPrint('$tag: 表单内容发生变化');
    // 🎯 使用智能变更检测
    hasChanges.value = hasAnyChanges;
    update(["profile_detial"]);
  }
  
  // 8. 业务方法
  
  // ==================== 专家信息访问 ====================
  // 注意：专家信息访问方法已通过 UserProfileMixin 提供
  // 可直接使用: currentExpertInfo, expertDisplayName, expertName 等
  
  // 🎯 页面特定的数据访问器（如需要特殊处理的话）
  
  /// 获取专家显示名称（页面特定逻辑）
  String get displayName => expertDisplayName;
  
  /// 获取专家手机号（页面特定逻辑）
  String get phone => expertPhone;
  
  /// 获取专家邮箱（页面特定逻辑）
  String get email => expertEmail;
  
  // ==================== 智能变更检测方法 ====================
  
  /// 🎯 检测专家信息变更，只返回真正改变的字段
  Map<String, String?> _detectChanges() {
    final changes = <String, String?>{};
    
    // 检测专家姓名变更
    final currentName = nameController.text.trim();
    if (currentName != _originalName) {
      changes['name'] = currentName;
      debugPrint('$tag: 🔍 检测到姓名变更: $_originalName → $currentName');
    }
    
    // 检测机构名称变更
    final currentCorpName = corpNameController.text.trim();
    if (currentCorpName != _originalCorpName) {
      changes['corpName'] = currentCorpName.isEmpty ? null : currentCorpName;
      debugPrint('$tag: 🔍 检测到机构变更: $_originalCorpName → $currentCorpName');
    }
    
    // 检测职务变更
    final currentOfficialCapacity = officialCapacityController.text.trim();
    if (currentOfficialCapacity != _originalOfficialCapacity) {
      changes['officialCapacity'] = currentOfficialCapacity.isEmpty ? null : currentOfficialCapacity;
      debugPrint('$tag: 🔍 检测到职务变更: $_originalOfficialCapacity → $currentOfficialCapacity');
    }
    
    // 检测手机号变更
    final currentPhone = phoneController.text.trim();
    if (currentPhone != _originalPhone) {
      changes['phone'] = currentPhone.isEmpty ? null : currentPhone;
      debugPrint('$tag: 🔍 检测到手机号变更: $_originalPhone → $currentPhone');
    }
    
    // 检测邮箱变更
    final currentEmail = emailController.text.trim();
    if (currentEmail != _originalEmail) {
      changes['email'] = currentEmail.isEmpty ? null : currentEmail;
      debugPrint('$tag: 🔍 检测到邮箱变更: $_originalEmail → $currentEmail');
    }
    
    debugPrint('$tag: 📊 变更检测完成 - 共检测到 ${changes.length} 个字段变更');
    if (changes.isEmpty) {
      debugPrint('$tag: 💡 没有任何字段发生变更');
    } else {
      debugPrint('$tag: 📝 变更字段: ${changes.keys.join(', ')}');
    }
    
    return changes;
  }
  
  /// 检查是否有任何变更
  bool get hasAnyChanges {
    final changes = _detectChanges();
    return changes.isNotEmpty;
  }
  
  // ==================== 表单验证相关方法 ====================
  
  /// 验证专家姓名
  String? validateName(String? value) {
    if (value == null || value.trim().isEmpty) {
      return '专家姓名不能为空';
    }
    if (value.trim().length < 2) {
      return '专家姓名至少2个字符';
    }
    if (value.trim().length > 20) {
      return '专家姓名不能超过20个字符';
    }
    return null;
  }
  
  /// 验证机构名称
  String? validateCorpName(String? value) {
    if (value != null && value.trim().isNotEmpty && value.trim().length > 50) {
      return '机构名称不能超过50个字符';
    }
    return null;
  }
  
  /// 验证职务
  String? validateOfficialCapacity(String? value) {
    if (value != null && value.trim().isNotEmpty && value.trim().length > 30) {
      return '职务不能超过30个字符';
    }
    return null;
  }
  
  /// 验证邮箱
  String? validateEmail(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 邮箱可以为空
    }
    
    final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
    if (!emailRegex.hasMatch(value.trim())) {
      return '请输入有效的邮箱地址';
    }
    return null;
  }
  
  /// 验证手机号
  String? validatePhone(String? value) {
    if (value == null || value.trim().isEmpty) {
      return null; // 手机号可以为空
    }
    
    final phoneRegex = RegExp(r'^1[3-9]\d{9}$');
    if (!phoneRegex.hasMatch(value.trim())) {
      return '请输入有效的手机号码';
    }
    return null;
  }
  
  
  // ==================== 保存相关方法 ====================
  
  /// 保存专家信息
  Future<void> saveExpertInfo() async {
    try {
      debugPrint('$tag: 开始保存用户信息');
      
      // 验证表单
      if (!formKey.currentState!.validate()) {
        debugPrint('$tag: 表单验证失败');
        return;
      }
      
      isSaving.value = true;
      hasError.value = false;
      update(["profile_detial"]);
      
      // 🎯 智能变更检测 - 只处理真正变更的字段
      final changes = _detectChanges();
      
      if (changes.isEmpty) {
        debugPrint('$tag: 💡 没有检测到任何变更，无需保存');
        _showInfoMessage('没有任何修改，无需保存');
        return;
      }
      
      debugPrint('$tag: 🚀 开始保存用户信息 - 智能变更模式');
      debugPrint('$tag: 📝 将只更新变更的字段: ${changes.keys.join(', ')}');
      
      // 🚀 简单清晰的流程：先调用API，成功后更新UserService
      debugPrint('$tag: 🔄 调用API更新用户信息');
      
      try {
        // 专家信息模型没有修改API，所以暂时只更新本地状态
        // TODO: 如果后续有专家信息修改API，可以在此调用
        debugPrint('$tag: 🔄 专家信息暂时只支持本地更新');
        
        // 直接更新本地专家信息
        final currentExpert = currentExpertInfo;
        if (currentExpert != null) {
          // 创建更新后的专家信息
          final updatedExpert = ExpertInfo(
            id: currentExpert.id,
            name: changes['name'] ?? currentExpert.name,
            corpName: changes['corpName'] ?? currentExpert.corpName,
            officialCapacity: changes['officialCapacity'] ?? currentExpert.officialCapacity,
            phone: changes['phone'] ?? currentExpert.phone,
            email: changes['email'] ?? currentExpert.email,
          );
          
          // 更新UserService
          await _userService.setExpertInfo(updatedExpert);
        }
        
        hasChanges.value = false;
        lastUpdateTime.value = DateTime.now().toString();
        
        _showSuccessMessage('个人信息保存成功');
        
        // 延迟返回上一页
        await Future.delayed(const Duration(milliseconds: 500));
        Get.back();
        
      } catch (e) {
        // ❌ API失败
        debugPrint('$tag: ❌ API调用失败: $e');
        _handleError('保存个人信息失败: ${e.toString()}');
      }
      
    } catch (e) {
      debugPrint('$tag: 保存用户信息异常: $e');
      _handleError('保存时发生错误');
    } finally {
      isSaving.value = false;
      update(["profile_detial"]);
    }
  }
  
  /// 重置表单
  void resetForm() {
    debugPrint('$tag: 重置表单');
    
    // 🎯 重新初始化表单控制器（从UserService获取最新数据）
    _loadExpertInfo();
    
    // 重置状态
    hasChanges.value = false;
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
    _showInfoMessage('表单已重置');
  }
  
  /// 返回上一页
  void onBackTap() {
    debugPrint('$tag: 用户点击返回');
    
    // 直接返回，不再显示确认对话框
    Get.back();
  }
  
  
  // ==================== 消息提示相关方法 ====================
  
  /// 显示成功消息
  void _showSuccessMessage(String message) {
    Get.snackbar(
      '成功',
      message,
      snackPosition: SnackPosition.TOP,
      backgroundColor: Colors.green.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 2),
    );
  }
  
  /// 显示错误消息
  void _showErrorMessage(String message) {
    Get.snackbar(
      '错误',
      message,
      snackPosition: SnackPosition.TOP,
      backgroundColor: Colors.red.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 3),
    );
  }
  
  /// 显示信息消息
  void _showInfoMessage(String message) {
    Get.snackbar(
      '提示',
      message,
      snackPosition: SnackPosition.BOTTOM,
      backgroundColor: Colors.blue.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 2),
    );
  }
  
  // ==================== 错误处理相关方法 ====================
  
  /// 处理错误
  void _handleError(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    debugPrint('$tag: 处理错误 - $message');
    _showErrorMessage(message);
    
    update(["profile_detial"]);
  }
  
  /// 重置错误状态
  void resetErrorState() {
    debugPrint('$tag: 重置错误状态');
    
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit - 控制器初始化');
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady - 页面准备就绪');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose - 控制器销毁');
    
    // 清理表单控制器
    nameController.dispose();
    corpNameController.dispose();
    officialCapacityController.dispose();
    phoneController.dispose();
    emailController.dispose();
    
    super.onClose();
  }
}
